package com.zenith.middleware.service;

import com.zenith.common.result.PageResult;
import com.zenith.common.result.Result;
import com.zenith.middleware.po.dto.storage.*;
import com.zenith.middleware.po.vo.storage.*;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 存储服务接口
 */
public interface StorageService {
    // =========================== 分片上传相关接口 ===========================
    
    Result<ChunkInitVO> initChunkUpload(ChunkInitDTO chunkInitDTO);

    /**
     * 上传分片
     */
    Result<ChunkUploadVO> uploadChunk(ChunkUploadDTO chunkUploadDTO);

    /**
     * 完成分片上传
     */
    Result<FileVO> completeChunkUpload(ChunkCompleteDTO chunkCompleteDTO);

    /**
     * 获取分片上传状态
     */
    Result<ChunkStatusVO> getChunkStatus(String uploadKey);

    // =========================== 网盘功能相关接口 ===========================
    
    Result<FolderVO> createFolder(FolderDTO folderDTO);

    /**
     * 获取文件夹树
     */
    Result<List<FolderVO>> getFolderTree(Long userId);

    /**
     * 获取文件夹中的文件列表
     */
    Result<PageResult<FolderFileVO>> getFolderFiles(FolderFileQueryDTO queryDTO);

    /**
     * 移动文件
     */
    Result<Boolean> moveFile(MoveFileDTO moveFileDTO);

    /**
     * 重命名文件或文件夹
     */
    Result<Boolean> rename(RenameDTO renameDTO);

    // =========================== 文件管理相关接口 ===========================
    
    Result<UploadInitVO> initUpload(UploadInitDTO uploadInitDTO);

    /**
     * 上传文件
     */
    Result<FileVO> uploadFile(MultipartFile file, Long fileId);

    /**
     * 下载文件
     */
    void downloadFile(Long fileId, HttpServletResponse response);

    /**
     * 删除文件
     */
    Result<Boolean> deleteFile(Long fileId);

    /**
     * 获取文件详情
     */
    Result<FileVO> getFileDetail(Long fileId);

    /**
     * 分页查询文件列表
     */
    Result<PageResult<FileVO>> listFiles(FileQueryDTO queryDTO);

    // =========================== 存储提供商相关接口 ===========================
    
    /**
     * 获取所有存储提供商列表
     */
    Result<List<StorageProviderVO>> listProviders();

    /**
     * 添加存储提供商
     */
    Result<Boolean> addProvider(ProviderDTO providerDTO);

    /**
     * 更新存储提供商
     */
    Result<Boolean> updateProvider(ProviderDTO providerDTO);

    /**
     * 删除存储提供商
     */
    Result<Boolean> deleteProvider(Long id);

    /**
     * 设置默认存储提供商
     */
    Result<Boolean> setDefaultProvider(Long id);

    /**
     * 获取默认存储提供商
     */
    Result<StorageProviderVO> getDefaultProvider();
}